package logica.persistencia;

import java.util.LinkedList;
import java.util.List;

import org.jdom.Element;

import vista.objetos.GraficableConEtiqueta;
import xml.ConstantesXml;
import xml.XMLManager;

import logica.Entidad;
import logica.Jerarquia;
import logica.JerarquiaException;
import logica.ObjetoDiagrama;
import logica.SinNombreException;

public class JerarquiaPersistente extends ObjetoDiagramaPersistente {

	public JerarquiaPersistente(ObjetoDiagrama objetoDiagrama) {
		super(objetoDiagrama);
		
	}

	public JerarquiaPersistente(GraficableConEtiqueta graficable) {
		super(graficable);
	}

	@Override
	public void serializar() {
		Element elementoJerarquia = new Element (ConstantesXml.ELEMENTO_JERARQUIA);
		Jerarquia jerarquia  = (Jerarquia) this.getObjetoDiagrama();
		
		super.serializarElementoGenerico(elementoJerarquia);
		
		String esParticipacionCompleta = jerarquia.esParticionCompleta()? "true" : "false";
		String haySolapamiento = jerarquia.haySolapamiento()? "true" : "false";
		elementoJerarquia.setAttribute(ConstantesXml.ATRIBUTO_PARTICIPACION_COMPLETA, esParticipacionCompleta);
		elementoJerarquia.setAttribute(ConstantesXml.ATRIBUTO_SOLAPAMIENTO, haySolapamiento);
	
		JerarquiaPersistente.serializarReferenciaEntidadPadre(elementoJerarquia, jerarquia);
		JerarquiaPersistente.serializarReferenciasEntidades(elementoJerarquia, jerarquia);
		XMLManager.getInstance().agregarElementoAObjetos(elementoJerarquia);
	}

	static public void serializarReferenciaEntidadPadre(Element elementoJerarquia,
			Jerarquia jerarquia) {
		EntidadPersistente entRP = jerarquia.getEntidadPadre().getObjetoDiagramaPersistente();
		int idRef = entRP.getIdentificador();
		elementoJerarquia.setAttribute(ConstantesXml.ATRIBUTO_ID_REF,  String.valueOf(idRef));
		elementoJerarquia.setAttribute(ConstantesXml.ATRIBUTO_NOMBRE,  jerarquia.getNombre());
		elementoJerarquia.setAttribute(ConstantesXml.ATRIBUTO_NOMBRE_REF, jerarquia.getEntidadPadre().getNombre());
	}
	
	static public void serializarReferenciasEntidades(Element elementoJerarquia,
			Jerarquia jerarquia) {
		if (jerarquia.getEntidadesEspecializadas().size() > 0) {
			Element listaEntidades = new Element (ConstantesXml.LISTA_REF_ENTIDADES);	
			for (Entidad entidad : jerarquia.getEntidadesEspecializadas()) {
				Element ref = EntidadGraficablePersistente.serializarElementoEntidadGraficable(entidad);
				listaEntidades.addContent(ref);
			}
			elementoJerarquia.addContent(listaEntidades);
				
		}
	}

	

	
	public void hidratar(Element elementoJerarquia) {
		String esParticipacionCompleta = elementoJerarquia.getAttributeValue(ConstantesXml.ATRIBUTO_PARTICIPACION_COMPLETA);
		String haySolapamiento = elementoJerarquia.getAttributeValue(ConstantesXml.ATRIBUTO_SOLAPAMIENTO); 
		String nombre = elementoJerarquia.getAttributeValue(ConstantesXml.ATRIBUTO_NOMBRE);
		
		Jerarquia jerarquia  = (Jerarquia) this.getObjetoDiagrama();
		jerarquia.setEsParticionCompleta(Boolean.valueOf(esParticipacionCompleta));
		jerarquia.setHaySolapamiento(Boolean.valueOf(haySolapamiento));
		
		Entidad  entidadPadre= EntidadPersistente.hidratarEntidadEnHash(elementoJerarquia);
		jerarquia.setEntidadPadre(entidadPadre);
		
		try {
			jerarquia.setNombre(nombre);

		} catch (SinNombreException e) {
			e.printStackTrace();
		}
		
		List<Entidad> entEsp = JerarquiaPersistente.hidratarEntidadesEspecializadas(elementoJerarquia);
		
		try {
			jerarquia.setEntidadEspecilizada(entEsp);
		} catch (JerarquiaException e) {
			e.printStackTrace();
		}
		
		//Hasheo el elemento para poder obtenerlo después a través del id
		String claveHash = elementoJerarquia.getAttributeValue(ConstantesXml.ATRIBUTO_ID_OBJETO);
		XMLManager.getInstance().hashObjetoDiagramaConClave(claveHash, this.getObjetoDiagrama());
				
		
	}

	public static List<Entidad> hidratarEntidadesEspecializadas(
			Element elementoJerarquia) {
		
		List<Entidad> entidades = new LinkedList<Entidad>();
		Element listaElementosEntidades = elementoJerarquia.getChild(ConstantesXml.LISTA_REF_ENTIDADES);
		if (listaElementosEntidades != null) {
			@SuppressWarnings("unchecked")
			List<Element> elementosEntidades = listaElementosEntidades.getChildren(ConstantesXml.ELEMENTO_REF_ENTIDAD);
							
			for (Element elementoEntidad : elementosEntidades) {
				Entidad ent = EntidadPersistente.hidratarEntidadEnHash(elementoEntidad);
				if (ent != null ) {
					entidades.add(ent);
				}	
			}
		}
		return entidades;
		
	}

}
